﻿#ifndef RTSACONTROL_IRTSAP2PENGINE_H
#define RTSACONTROL_IRTSAP2PENGINE_H

#include <cstdint>
#include "HRTSAEngineParam.h"
#include "IHRTSAP2pEventHandler.h"

#ifdef P2P_ADAPTER_EXPORT
#ifdef CONTROL_WINDOWS
#define RTSA_P2P_ENGINEAPI __declspec(dllexport)
#else
#define RTSA_P2P_ENGINEAPI __attribute__((__visibility__("default")))
#endif
#else
#define RTSA_P2P_ENGINEAPI
#endif

namespace huawei {
namespace rtsap2p {
// 加入房间的参数
struct HRTSAP2pLoginParam {
    char appId[huawei::rtsa::RTSA_MAX_APPID_LEN];
    char token[huawei::rtsa::RTSA_MAX_SIGNATURE_LEN];
    char userId[huawei::rtsa::RTSA_MAX_USERID_LEN];
    char roomId[huawei::rtsa::RTSA_MAX_ROOMID_LEN];
    long long ctime = 0;
};

// p2p相关统计项
struct HRTSAP2pStatistics {
    int32_t timeSyncOffset;  // 本端与对端的时钟偏差值
};

class IHRTSAP2pEngine {
public:
    virtual ~IHRTSAP2pEngine() = default;
    // ==================================Common==============================================
    /**
     * 初始化引擎 (复用RTSA的joinroom接口)
     * 约束: 当前只支持创建1路连接
     * 3. scenario 模式使用p2p模式
     * @param appId 应用程序的APPId
     * @param userId 用户ID
     * @param roomId 房间ID
     * @param token jwt鉴权信息
     * @return 0(success),other(failed)
     */
    virtual int login(const HRTSAP2pLoginParam &loginParam) = 0;

    /**
     * 网络配置信息
     *
     * @param config
     * @return 0(success),other(failed)
     */
    virtual int setInitConfig(const huawei::rtsa::HRTSAInitConfig &config) = 0;
    /**
     * 主动刷新认证
     *
     * @param token 签名
     * @param ctime 时间戳
     */
    virtual int renewAuthorization(const char *token, long long ctime) = 0;

    /**
     * 销毁实例
     *
     * @return 0(success),other(failed)
     */
    virtual int destory() = 0;

    /**
     * 创建P2pConnection连接 (复用RTSA的joinroom接口)
     * 约束: 当前只支持创建1路连接.
     * 返回值： cid编号， 如果为负数，则是错误码
     * 3. scenario 模式使用p2p模式
     */
    virtual int connectPeer() = 0;

    /**
     * 断开PeerConnection连接 (复用RTSA的leave接口)
     *
     */
    virtual int disConnectPeer() = 0;

    /**
     * ping对端查询链接状态是否okay。（该接口存在网络时延，超时时间为1秒）
     * @param PeerConnectionState 0: 连接未打通 1：连接已经打通
     * @return 0(success),other(failed)
     */
    virtual int pingPeer() = 0;

    /**
     * 向对端发送数据包
     *  约束: packerData长度低于1300字节
     */
    virtual int sendPeerPacketData( const unsigned char *packetData, unsigned int length) = 0;


    /*获取统计信息*/
    virtual void GetStatistics(HRTSAP2pStatistics &statistics) = 0;

    // private
    virtual int32_t GetEngineKey4Report(std::uintptr_t &engineKey) = 0;

    /* *
     * 资源标签
     * joinroom前调用
     *
     * @param resourceTags:资源标签字符串
     * @param num:资源标签数量
     * @return 0(success),other(failed)
     */
    virtual int setAccessResourceType(char *resourceTags[], int num) = 0;

    /* *
     * 设置内网标志
     * joinroom前调用
     * @param:内网相关参数
     * @return 0(success),other(failed)
     */
    virtual int setIntranetEnv(const huawei::rtsa::HRTSAIntranetParam &param) = 0;

    virtual int setLocalProxyServer(const huawei::rtsa::HRTSAProxyParam &param) = 0;
    /* *
     * 设置信令相关信息字符
     * @return 0(success),other(failed)
     */
    virtual int sendMsg(const char* msgInfo) = 0;

    /*
    * 设置网卡
    */
    virtual int setNetworkInterface(const huawei::rtsa::HRTSANicParam& param) = 0;

	virtual int getLocalConnIdByUsrUid() = 0;

	virtual int getRemoteConnIdByUsrUid(const char* usrid) = 0;
    
    virtual int setVersion(const char * version) = 0;
};
} // namespace rtsa
} // namespace huawei

RTSA_P2P_ENGINEAPI huawei::rtsap2p::IHRTSAP2pEngine *createHRTSAP2PEngine(huawei::rtsa::HRTSACreateParam *createParam,
    huawei::rtsap2p::IHRTSAP2pEventHandler *rtsaEventHandler);

#endif // RTSACONTROL_IRTSAENGINE_H